package marketplace.componente.usuarios;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import javax.persistence.TypedQuery;


import marketplace.entities.Cliente;
import marketplace.entities.Proveedor;
import marketplace.entities.Usuario;
import marketplace.objects.ClienteBO;
import marketplace.objects.ProveedorBO;
import marketplace.objects.UsuarioBO;


//java:global/EnterpriseMarketplaceProject/ComponenteUsuarios/AdminUsuarios
/**
 * Session Bean implementation class AdminUsuarios
 */
@Stateless
public class AdminUsuarios implements AdminUsuariosRemote{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@PersistenceContext(unitName="MarketPlacePersistenceComponent")
	private EntityManager em;
	
    /**
     * Default constructor. 
     */
    public AdminUsuarios() {
        // TODO Auto-generated constructor stub
    }

	@Override
	public void registrarUsuario(UsuarioBO nUsuario, String tipo) {
		// TODO Auto-generated method stub
		Cliente test = new Cliente(new ClienteBO("test", "test@test", "123", "usuarioTest", "123"));
		em.persist(test);	
		
		Cliente encontrado = (Cliente)em.find(Cliente.class, "usuarioTest");
		
		System.out.println(encontrado.getNombre());
		System.out.println(encontrado.getCorreo());
		System.out.println(encontrado.getTelefono());
		System.out.println(encontrado.getLogin());
		System.out.println(encontrado.getPassword());
		System.out.println(encontrado.getTransacciones());
//		
//		//em.remove(encontrado);
		
//		if(tipo.equals(UsuarioBO.CLIENTE)){
//			Cliente temp = new Cliente((ClienteBO)nUsuario);
//			em.persist(temp);
//		}
//		else{
//			Proveedor temp = new Proveedor((ProveedorBO)nUsuario);
//			em.persist(temp);
//		}		
	}

	@Override
	public void actualizarInfoUsuario(UsuarioBO nUsuario, String tipo) {
		// TODO Auto-generated method stub
		if(tipo.equals(UsuarioBO.CLIENTE)){
			Cliente temp = new Cliente((ClienteBO)nUsuario);
			em.merge(temp);
		}
		else{
			Proveedor temp = new Proveedor((ProveedorBO)nUsuario);
			em.merge(temp);
		}
		
	}

	@Override
	public boolean validarUsuario(String login, String password) {
		// TODO Auto-generated method stub
		Usuario temp = (Usuario)em.find(Usuario.class, login);
		if(temp.getPassword().equals(password))
			return true;
		
		return false;
	}

	@Override
	public UsuarioBO consultarUsuario(String login) {
		// TODO Auto-generated method stub
		Usuario temp = (Usuario)em.find(Usuario.class, login);
		
		if(temp.getTipo().equals(UsuarioBO.CLIENTE)){
			return new ClienteBO((Cliente)temp);
		}
		else{
			return new ProveedorBO((Proveedor)temp);
		}
	}

	@Override
	public ProveedorBO consultarProveedor(String login) {
		// TODO Auto-generated method stub
		return new ProveedorBO((Proveedor)em.find(Proveedor.class, login));
	}

	@Override
	public ClienteBO consultarCliente(String login) {
		// TODO Auto-generated method stub
		return new ClienteBO((Cliente)em.find(Cliente.class, login));
	}
	
	@Override
	public void eliminarUsuario(String login){
		
		Usuario temp = (Usuario)em.find(Usuario.class, login);
		
		em.remove(temp);
	}

	@Override
	public void eliminarProveedor(String login) {
		// TODO Auto-generated method stub
		Proveedor temp = (Proveedor)em.find(Proveedor.class, login);
		
		em.remove(temp);		
	}

	@Override
	public void eliminarCliente(String login) {
		// TODO Auto-generated method stub
		Cliente temp = (Cliente)em.find(Cliente.class, login);
		
		em.remove(temp);
		
	}

	@Override
	public ArrayList<ProveedorBO> consultarProveedoresPorTipoServicio(
			String tipoServicio) {
		// TODO Auto-generated method stub
//		Proveedor prov = new Proveedor();
//		prov.setLogin("kvrass");
//		prov.setPassword("123");
//		prov.setNombre("test");
//		
//		Alojamiento al = new Alojamiento();
//		al.setNombre("hilton");
//		
//		ArrayList<Servicio> servs = new ArrayList<Servicio>();
//		servs.add(al);
//		
//		prov.setServicios(servs);
//		
//		em.persist(prov);
					
		TypedQuery<Proveedor> q = em.createQuery("SELECT p FROM Proveedor p IN (p.servicios) AS t WHERE t.tipo=:tipoServicio", Proveedor.class);
		q.setParameter("tipoServicio",tipoServicio);
		List<Proveedor> lista= q.getResultList();
		
		ArrayList<ProveedorBO> coll = new ArrayList<ProveedorBO>();
		
		
		for(Proveedor p:lista){
			
			
			ProveedorBO temp = new ProveedorBO(p);
			coll.add(temp);
		}
		
		return coll;
		
	}

	@Override
	public ArrayList<UsuarioBO> consultarUsuariosPorParametro(String param,
			String valor) {
		// TODO Auto-generated method stub
		
		
		TypedQuery<Usuario> query= em.createQuery("SELECT p FROM Usuario p WHERE p.:param= :valor", Usuario.class);
		query.setParameter("param",param);
		query.setParameter("valor",valor);

		List<Usuario> lista= query.getResultList();
		
		ArrayList<UsuarioBO> coll = new ArrayList<UsuarioBO>();
		
		
		for(Usuario p:lista){
						
			UsuarioBO temp = p.getTipo().equals(UsuarioBO.CLIENTE)?new ClienteBO((Cliente)p):new ProveedorBO((Proveedor)p);
			coll.add(temp);
		}
		
		return coll;
	}

	

}
